package org.iteasy.framework.base;

import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;

import java.util.List;
import java.util.Map;
import java.util.function.Consumer;

public interface BaseService<T> {

    /**
     * 查询所有
     * @return
     */
    List<T> findAll();

    /**
     * 根据id查询
     * @param id
     * @return
     */
    T findById(Long id);

    /**
     * 根据id集合查询
     * @param ids
     * @return
     */
    List<T> findByIds(List<Long> ids);

    /**
     * 根据对象查询
     * @param t
     * @return
     */
    List<T> find(T t);

    /**
     * 根据example查询
     * @param example
     * @return
     */
    List<T> findByExample(Example<T> example);

    /**
     * 根据example 查询数量
     * @param example
     * @return
     */
    long findCountByExample(Example<T> example);

    /**
     * 根据 字段名 in查询
     * @param name
     * @param values
     * @return
     */
    List<T> findByNameIn(String name, List<Object> values);

    /**
     * 根据 key => 字段名  value => 值查询
     * @param map
     * @return
     */
    List<T> findByName2Value(Map<String, Object> map);

    /**
     * 分页查询
     * @param pageable
     * @return
     */
    Page<T> page(Pageable pageable);

    /**
     * 分页查询
     * @param example
     * @param pageable
     * @return
     */
    Page<T> page(Example<T> example, Pageable pageable);

    /**
     * 分页查询并排序
     * @param example
     * @param pageable
     * @param sort
     * @return
     */
    Page<T> pageAndSort(Example<T> example, Pageable pageable, Sort sort);

    /**
     * 插入
     * @param t
     * @return
     */
    T save(T t);

    /**
     * 插入 如果失败直接抛出异常
     * @param t
     * @return
     */
    T saveOrThrow(T t);


    /**
     * 批量插入
     * @param list
     * @return
     */
    boolean batchSave(List<T> list);

    /**
     * 批量更新
     * @param list
     * @return
     */
    boolean batchSaveOrThrow(List<T> list);

    /**
     * 删除
     * @param id
     * @return
     */
    boolean delete(Long id);

    /**
     * 批量删除
     * @param ids
     * @return
     */
    boolean batchDelete(List<Long> ids);

    /**
     * 批量产出
     * @param ids
     * @param success   删除成功
     * @param error     删除失败
     */
    void batchDelete(List<Long> ids, Consumer<Long> success, Consumer<Long> error);

    /**
     * 插入 根据字段名和字段值校验是否存在
     * @param field
     * @param value
     * @return
     */
    boolean existsForInsert(String field, Object value);

    /**
     * 插入 根据字段名和字段值校验是否存在，存在抛出异常
     * @param field
     * @param value
     * @param msg
     */
    void existsForInsert(String field, Object value, String msg);

    /**
     * 插入 根据字段名和字段值校验是否存在，存在  返回 false
     * @param fieldMap
     * @return
     */
    boolean existsForInsert(Map<String,Object> fieldMap);

    /**
     * 插入 根据字段名和字段值校验是否存在，存在抛出异常
     * @param fieldMap
     * @param msg
     */
    void existsForInsert(Map<String, Object> fieldMap, String msg);

    /**
     * 更新 根据字段名和字段值校验是否存在，存在  返回 false
     * @param id
     * @param field
     * @param value
     * @return
     */
    boolean existsForUpdate(Long id, String field, Object value);

    /**
     * 更新 根据字段名和字段值校验是否存在，存在抛出异常
     * @param id
     * @param field
     * @param value
     * @param msg
     */
    void existsForUpdate(Long id, String field, Object value, String msg);

    /**
     * 更新 根据字段名和字段值校验是否存在，存在  返回 false
     * @param id
     * @param fieldMap
     * @return
     */
    boolean existsForUpdate(Long id, Map<String,Object> fieldMap);

    /**
     * 更新 根据字段名和字段值校验是否存在，存在抛出异常
     * @param id
     * @param fieldMap
     * @param msg
     */
    void existsForUpdate(Long id, Map<String, Object> fieldMap, String msg);

}
